EDA#
# Librerias
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import os
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Definir la paleta de colores personalizada
custom_colors = ['#1F3040', '#B9CDCA', '#F2C6AC', '#D99982', '#735749']
Importar datos#
ventas = pd.read_csv('C:/UNINORTE/VC/Proyecto2/Archivos_Finales/datosventas.csv')
columnasenteras = ['rooms', 'baths', 'park', 'Estrato']
for columna in columnasenteras:
ventas[columna] = ventas[columna].astype(int)
# Mostrar las primeras filas del DataFrame
ventas.head()
| lat | long | category | price | rooms | baths | park | ciudad | barrio | area_privada | area_const | admon | Estrato | Estado | Antiguedad | Piso No | Tipo de Apartamento | Sector | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 3.377575 | -76.523969 | Apartamento | 197000000.0 | 2 | 2 | 1 | Cali | Ciudad Bochalema | 64.0 | 64.0 | 178000.000000 | 4 | No Especificado | 1 a 8 años | NaN | No Especificado | Ciudad Bochalema |
| 1 | 4.563951 | -74.107534 | Apartaestudio | 70000000.0 | 1 | 1 | 0 | Bogotá | Las Lomas | 30.0 | 30.0 | 45000.000000 | 2 | No Especificado | 16 a 30 años | NaN | No Especificado | Las Lomas |
| 2 | 6.264103 | -75.603076 | Apartamento | 235000000.0 | 3 | 2 | 1 | Medellín | Calasanz Occidente | 56.0 | 56.0 | 192139.000000 | 3 | No Especificado | No Especificado | 13.0 | No Especificado | No Especificado |
| 3 | 10.993099 | -74.817276 | Apartaestudio | 139000000.0 | 1 | 1 | 1 | Barranquilla | Ciudad Jardín | 43.0 | 43.0 | 145000.000000 | 4 | No Especificado | No Especificado | 4.0 | No Especificado | No Especificado |
| 4 | 6.248413 | -75.563910 | Apartamento | 260000000.0 | 4 | 2 | 0 | Medellín | Centro | 115.0 | 115.0 | 177878.235981 | 4 | 4.0 | 9 a 15 años | 3.0 | No Especificado | Centro |
# Obtener información general del DataFrame
print(ventas.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 155105 entries, 0 to 155104
Data columns (total 18 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 lat 155105 non-null float64
1 long 155105 non-null float64
2 category 155105 non-null object
3 price 155105 non-null float64
4 rooms 155105 non-null int32
5 baths 155105 non-null int32
6 park 155105 non-null int32
7 ciudad 155105 non-null object
8 barrio 155105 non-null object
9 area_privada 155105 non-null float64
10 area_const 155105 non-null float64
11 admon 155105 non-null float64
12 Estrato 155105 non-null int32
13 Estado 155105 non-null object
14 Antiguedad 155105 non-null object
15 Piso No 112509 non-null float64
16 Tipo de Apartamento 155105 non-null object
17 Sector 155105 non-null object
dtypes: float64(7), int32(4), object(7)
memory usage: 18.9+ MB
None
# Descripción estadística de las variables numéricas
ventas.describe().T
| count | mean | std | min | 25% | 50% | 75% | max | |
|---|---|---|---|---|---|---|---|---|
| lat | 155105.0 | 5.652091e+00 | 2.204566e+00 | 3.254000e+00 | 4.648077e+00 | 4.721532e+00 | 6.210060e+00 | 1.104366e+01 |
| long | 155105.0 | -7.487562e+01 | 8.883420e-01 | -7.657500e+01 | -7.557198e+01 | -7.420027e+01 | -7.406731e+01 | -7.396190e+01 |
| price | 155105.0 | 4.984872e+08 | 4.051956e+08 | 2.000000e+06 | 2.400000e+08 | 3.750000e+08 | 6.000000e+08 | 4.900000e+09 |
| rooms | 155105.0 | 3.003527e+00 | 1.033709e+00 | 1.000000e+00 | 2.000000e+00 | 3.000000e+00 | 3.000000e+00 | 7.000000e+00 |
| baths | 155105.0 | 2.559737e+00 | 1.121071e+00 | 0.000000e+00 | 2.000000e+00 | 2.000000e+00 | 3.000000e+00 | 7.000000e+00 |
| park | 155105.0 | 1.182457e+00 | 9.385399e-01 | 0.000000e+00 | 1.000000e+00 | 1.000000e+00 | 2.000000e+00 | 5.000000e+00 |
| area_privada | 155105.0 | 1.114881e+02 | 6.199171e+01 | 1.000000e+00 | 6.500000e+01 | 9.400000e+01 | 1.390000e+02 | 3.250000e+02 |
| area_const | 155105.0 | 1.139092e+02 | 6.337710e+01 | 1.000000e+00 | 6.600000e+01 | 9.600000e+01 | 1.440000e+02 | 3.319651e+02 |
| admon | 155105.0 | 3.498544e+05 | 2.571560e+05 | 0.000000e+00 | 1.600000e+05 | 2.840000e+05 | 4.790000e+05 | 2.118338e+06 |
| Estrato | 155105.0 | 4.101970e+00 | 9.879393e-01 | 1.000000e+00 | 3.000000e+00 | 4.000000e+00 | 5.000000e+00 | 6.000000e+00 |
| Piso No | 112509.0 | 3.753531e+00 | 3.098129e+00 | 1.000000e+00 | 1.000000e+00 | 3.000000e+00 | 5.000000e+00 | 1.600000e+01 |
# Verificar valores nulos
print(ventas.isnull().sum())
lat 0
long 0
category 0
price 0
rooms 0
baths 0
park 0
ciudad 0
barrio 0
area_privada 0
area_const 0
admon 0
Estrato 0
Estado 0
Antiguedad 0
Piso No 42596
Tipo de Apartamento 0
Sector 0
dtype: int64
# Seleccionar columnas numericas
columnas_numericas = ventas.select_dtypes(include=['int', 'float']).columns
# Guardar los nombres de las columnas numericas en una lista
nombre_columna_numericas = list(columnas_numericas )
# Seleccionar columnas categóricas
columnas_categoricas = ventas.select_dtypes(include=['object', 'category']).columns
# Guardar los nombres de las columnas categóricas en una lista
nombre_columna_categorica = list(columnas_categoricas)
Histograma de precio por ciudad y estrato#
# Histograma de price por estrato
fig = px.histogram(ventas, x='price', color='Estrato',
barmode='overlay',
title='Histograma de precio por estrato',
labels={'price': 'Precio'},
opacity=0.75,
color_discrete_sequence=custom_colors)
# Personalizar el gráfico
fig.update_layout(xaxis_title='Precio', yaxis_title='Frecuencia')
fig.update_traces(marker_line_width=1.5, marker_line_color='black')
# Mostrar el gráfico
fig.show()
# Histograma de price por ciudad
fig = px.histogram(ventas, x='price', color='ciudad',
barmode='overlay',
title='Histograma de precio por ciudad',
labels={'price': 'Precio'},
opacity=0.75,
color_discrete_sequence=custom_colors)
# Personalizar el gráfico
fig.update_layout(xaxis_title='Precio', yaxis_title='Frecuencia')
fig.update_traces(marker_line_width=1.5, marker_line_color='black')
# Mostrar el gráfico
fig.show()
Histograma de cada columna en contraste con el precio#
# Definir las columnas para las que quieres generar el gráfico
columns = ['area_privada', 'area_const', 'admon','rooms', 'baths', 'park']
# Iterar sobre cada columna para crear un gráfico
for col in columns:
# Crear subplot con dos ejes y-y
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Agregar el histograma para la columna actual
fig.add_trace(
go.Histogram(x=ventas[col], name=col, marker_color=custom_colors[0]),
secondary_y=False,
)
# Calcular el precio promedio para cada bin de la columna actual
bins = pd.cut(ventas[col], 20)
grouped = ventas.groupby(bins)['price'].mean().reset_index()
# Usar el punto medio de cada intervalo como coordenada x para la línea
grouped['mid'] = grouped[col].apply(lambda x: x.mid)
# Agregar la línea de precio promedio
fig.add_trace(
go.Scatter(x=grouped['mid'], y=grouped['price'], name=f'Precio Promedio {col}', mode='lines+markers', line=dict(color=custom_colors[4])),
secondary_y=True,
)
# Actualizar el layout del gráfico
fig.update_layout(
title_text=f'Histograma y Precio Promedio de {col}',
xaxis_title=col,
yaxis_title='Frecuencia',
legend_title='Variable',
)
# Configurar el eje y secundario para el precio promedio
fig.update_yaxes(title_text='Precio Promedio', secondary_y=True)
# Mostrar el gráfico
fig.show()